===
前言
如果不靠kubeadm的話,請參考Kyle Bai大大的這一篇
Kubernetes v1.11.x HA 全手動苦工安裝教學(TL;DR)
https://kairen.github.io/2018/07/09/kubernetes/deploy/manual-v1.11/
才可以真正學到更多k8s的基礎
===
體會過docker的美好之後,其實我們的目的都達到了,
在DevOps的CI的部分,我們選擇了gitlab ci,而且全部都用docker
接下來困難的要來囉,k8s有更多網路的設定,我們一起挑戰吧
我發現每次跑完不用專案的「 vagrant + ansible 自動建 k8s cluster 專案」host會留一些東西在
只刪 .vagrant 跟 VirtualBox 的 VM,是刪不乾淨的
比如: /etc/hosts、VirtualBox的虛擬網卡等
所以今天,
我會用 VMWare Fusion 建一個 CPU 給 2核心、2 GB RAM 的 VM,裝 Ubuntu 18.04,
來建 Master Node,一切的實驗就在這台 VM 上。
建議不要用VMWare Fusion的easy install,裝完的VM都會卡卡der~
KaiRen's Blog 的「利用 kubeadm 部署 Kubernetes v1.11.x HA 叢集」,搭配k8s官網的文件來實作。
Kyle Bai,2018-07-17(很新呢,讚!)
https://kairen.github.io/2018/07/17/kubernetes/deploy/kubeadm-v1.11-ha/
https://kubernetes.io/docs/setup/
本文會把上述2篇融合,Node資訊完全參照Kyle Bai大大的文章,一些指令的參數用官網文件的來補充
心中的OS:真的要惡補一下網管的基礎了…
Cluster IP CIDR: 10.244.0.0/16
Service Cluster IP CIDR: 10.96.0.0/12
Service DNS IP: 10.96.0.10
DNS DN: cluster.local
Kubernetes API VIP: 172.22.132.9
Kubernetes Ingress VIP: 172.22.132.8 # 如果有用到的話
Node資訊
Hostname, VIP, CPU核心數, Memory
k8s-m1, 172.22.132.10, 2, 2G
k8s-n1, 172.22.132.13, 2, 2G
k8s-n2, 172.22.132.14, 2, 2G
VMWare Fusion Ubuntu 18.04,全部操作用root,所以我的指令都不加sudo囉
正式環境就不能這樣了,k8s就像包含完整的網路環境,自然各種網管設定都要考慮進去
$ passwd root # 變更root密碼
$ su # 切換到root
在挑戰全自動設定前,我們先來挑戰手動建置,邊建置邊學習,否則全自動建置的專案我們也看不懂。
其實我每篇文章都是邊寫邊做,如果有做成功再po出來。
零.事前準備(只是做基本安裝設定,不會遇到困難)
VM剛裝好Ubuntu Desktop 18.04後
1.先改Hostname
# 如果你的命令提示字元長這樣user@Ubuntu$ 就要改一下 Hostname
$ passwd root # 變更root密碼
$ su # 切換到root
$ gedit /etc/cloud/cloud.cfg
# 找到這一行改成ture preserve_hostname: true
$ gedit /etc/hostname
# 把你現在的Hostname改成「Node資訊」的Hostname
$ gedit /etc/hosts # 這個是local端的 domain ip 對應檔
# 把你現在的Hostname改成「Node資訊」的Hostname or domain name
$ reboot # 重開機
2.關防火牆(一般剛裝好的ubuntu都沒有啟用firewall服務,這段不用執行)
# 亂槍打鳥…個人平常是用ufw全封鎖
#
$ systemctl stop firewalld && systemctl disable firewalld # 也不知道這是關哪一個
$ ufw disable # uncomplicated firewall,Ubuntu預設的firewall
$ setenforce 0
$ gedit /etc/selinux/config # Ubuntu不知道預設有沒有selinux...
# SELINUX=disabled
3.封包轉送
$ cat <<EOF | tee /etc/sysctl.d/k8s.conf
net.ipv4.ip_forward = 1
# 下面bridge iptable預設ubuntu沒有
# net.bridge.gridge-nf-call-ip6tables = 1 # 啟用
# net.bridge.bridge-nf-call-iptables = 1 # 把橋接的ipv4的封包傳給iptables'chains
EOF
$ sysctl -p /etc/sysctl.d/k8s.conf
5.4.關閉SWAP
$ swapoff -a && sysctl -w vm.swappiness=0
$ sed '/swap.img/d' -i /etc/fstab
$ gedit /etc/fstab # 註解掉有SWAP那行
5.安裝Docker
官網說Docker不要裝到最新版,因為他們還沒測試過,我們就裝Docker CE 17.03吧
從Ubuntu的存儲庫安裝Docker:
$ apt-get install curl # 裝一下curl
$ curl -fsSL https://get.docker.com/ | sh
$ apt-get update
$ apt-get install -y docker.io
$ systemctl enable docker && systemctl start docker # 開機自動跑起來
# 如果遇到下列的錯誤
Synchronizing state of docker.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable docker
Failed to enable unit: Unit file /etc/systemd/system/docker.service is masked.
$ systemctl unmask docker.service
$ systemctl unmask docker.socket
$ systemctl start docker.service
# 檢查網路服務
$ systemctl list-unit-files | grep docker
$ docker ps -a # 看docker在運行的container
6.安裝kubeadm、kubelet、kubectl (這些版本是相關聯的,升級要小心)
kubeadm:快速建cluster的程式(目前還是測試版喔~)
$ apt-get update && apt-get upgrade # 更新kubeadm
kubelet:每個Node必裝的,用來跑pod、container。
kubectl:用來做k8s cluster通信
$ apt-get update && apt-get install -y apt-transport-https curl
$ curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
$ cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
# 內容只有一行的話也可以這麼下
# echo "deb http://apt.kubernetes.io/ kubernetes-xenial main" | tee /etc/apt/sources.list.d/kubernetes.list
# 故障排除:
# 如果你加source後,連apt-get update都掛掉了…
# 可能是剛剛加的source(例如:docker、kubernetes)重複了
# gedit /etc/apt/sources.list # 把剛剛加的都刪掉重作
$ apt-get update
$ apt-get install -y kubelet kubeadm kubectl
# 如果上面3個程式,要固定版本號
# $ export KUBE_VERSION="1.11.0"
# $ apt-get update && apt-get install -y kubelet=${KUBE_VERSION}-00 kubeadm=${KUBE_VERSION}-00 kubectl=${KUBE_VERSION}-00
$ apt-mark hold kubelet kubeadm kubectl
裝完kubelet後,kubelet每隔幾秒重新啟動一次,因為它在一個crashloop中等待kubeadm告訴它該做什麼事。
直到初使化Master Node之後kubelet才正常
$ systemctl daemon-reload
$ systemctl restart kubelet
https://kubernetes.io/docs/setup/independent/install-kubeadm/
一、先來看這個章節 Bootstrapping Clusters with kubeadm
1.檢查
a.檢查hostname、MAC、UUID必須是不同的
所以建議以後建第2個Node時,你的VM不要用複製的,
我會手動灌3台VM: k8s-m1、k8s-n1、k8s-n2當作source,要練習時copy一份來玩,玩壞了再copy重來
查MAC ip link or ifconfig -a
查UUID sudo cat /sys/class/dmi/id/product_uuid
C9134D56-E771-BEA9-A48B-4D58C6542371
b.須要用到的ports(請參考原文)
為省麻煩的,關掉所有的防火牆
配置Master Node上的kubelet使用的cgroup driver
使用Docker時,kubeadm會自動檢測kubelet的cgroup driver,並設置在/var/lib/kubelet/kubeadm-flags.env
2.使用kubeadm建single Master Cluster,並建Pod network(Pod間可互相溝通)
a.Master Node的預先準備(每個Master Node都要做)
HAProxy (TCP/HTTP reverse proxy、TCP/HTTP Load Balancer)
建立 HAProxy 來提供 Kubernetes API Server 的負載平衡
$ mkdir -p /etc/haproxy/ # -p 就是可以連子目錄一起建
# 新增/etc/haproxy/haproxy.cfg設定檔, 每個Node都要放
# 建議用gedit編輯比較人性
$ cat <<EOF > /etc/haproxy/haproxy.cfg
global
log 127.0.0.1 local0
log 127.0.0.1 local1 notice
tune.ssl.default-dh-param 2048
defaults
log global
mode http
option dontlognull
timeout connect 5000ms
timeout client 600000ms
timeout server 600000ms
listen stats
bind :9090
mode http
balance
stats uri /haproxy_stats
stats auth admin:admin123
stats admin if TRUE
frontend kube-apiserver-https
mode tcp
bind :8443 # API Server 的 Proxy
default_backend kube-apiserver-backend
backend kube-apiserver-backend
mode tcp
balance roundrobin
stick-table type ip size 200k expire 30m
stick on src
server apiserver1 172.22.132.10:6443 check # master1
# server apiserver2 172.22.132.11:6443 check # master2,以後有需要再加
# server apiserver3 172.22.132.12:6443 check # master3
EOF
$ mkdir -p /etc/kubernetes/manifests/ # 放 Static Pod 的 YAML檔
# 新增一個 YAML檔來提供 HAProxy 的 Static Pod 部署
$ cat <<EOF > /etc/kubernetes/manifests/haproxy.yaml
kind: Pod
apiVersion: v1
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
component: haproxy
tier: control-plane
name: kube-haproxy # Pod的名稱
namespace: kube-system # 如果沒有給namespace,會跑到default
spec:
hostNetwork: true
priorityClassName: system-cluster-critical
containers:
- name: kube-haproxy
image: docker.io/haproxy:latest # 1.7-alpine # https://hub.docker.com/_/haproxy/
resources:
requests:
cpu: 100m
volumeMounts: # 掛載到 Pod
- name: haproxy-cfg
readOnly: true
mountPath: /usr/local/etc/haproxy/haproxy.cfg
volumes: # 定義 volume
- name: haproxy-cfg
hostPath: # 檔案是放在某個 Node,當 Pod 重建後不一定會在同一個 Node,建議用 雲端或私有網路空間
path: /etc/haproxy/haproxy.cfg # Node的檔案位置
type: FileOrCreate
EOF
建立 Keepalived 來提供 Kubernetes API Server 的 VIP
# 新增一個 Keepalived YAML檔來
$ cat <<EOF > /etc/kubernetes/manifests/keepalived.yaml
kind: Pod
apiVersion: v1
metadata:
annotations:
scheduler.alpha.kubernetes.io/critical-pod: ""
labels:
component: keepalived
tier: control-plane
name: kube-keepalived
namespace: kube-system
spec:
hostNetwork: true
priorityClassName: system-cluster-critical
containers:
- name: kube-keepalived
image: docker.io/osixia/keepalived:1.4.5 # https://hub.docker.com/r/osixia/keepalived/tags/
env:
- name: KEEPALIVED_VIRTUAL_IPS # Keepalived 提供的 VIPs
value: 172.22.132.9 # Kubernetes API VIP
- name: KEEPALIVED_INTERFACE # 發的VIPs的網卡
value: enp3s0
- name: KEEPALIVED_UNICAST_PEERS # 其他 Keepalived 節點的單點傳播 IP
value: "#PYTHON2BASH:['172.22.132.10']"
# value: "#PYTHON2BASH:['172.22.132.10', '172.22.132.11', '172.22.132.12']"
- name: KEEPALIVED_PASSWORD # Keepalived auth_type 的 Password
value: d0cker
- name: KEEPALIVED_PRIORITY # 接手的介面之順序,數字越小,優先順序越高。我們只作1台Master Node
value: "100"
- name: KEEPALIVED_ROUTER_ID # Keepalived instance 的識別id
value: "51"
resources:
requests:
cpu: 100m
securityContext:
privileged: true
capabilities:
add:
- NET_ADMIN
EOF
b.initial(初使化)Master Node 1(應該只會建1個吧)
建立 control plane components
$ cat <<EOF > kubeadm-config.yaml
apiVersion: kubeadm.k8s.io/v1alpha2
kind: MasterConfiguration
kubernetesVersion: v1.12.1 # 要跟你裝的kubeadm版本一樣
apiServerCertSANs:
- "172.22.132.9" # Kubernetes API VIP
api:
# 定義在/etc/haproxy/haproxy.cfg的 API Server 的 Proxy 聽的 port
# API server(跟kubectl CLI溝通)
controlPlaneEndpoint: "172.22.132.9:8443"
etcd: # cluster的資料庫,分散式鍵值儲存區,用來儲存叢集的狀態(包含:Secrets, ConfigMaps)
local:
extraArgs:
listen-client-urls: "https://127.0.0.1:2379,https://172.22.132.10:2379"
advertise-client-urls: "https://172.22.132.10:2379"
listen-peer-urls: "https://172.22.132.10:2380"
initial-advertise-peer-urls: "https://172.22.132.10:2380"
initial-cluster: "k8s-m1=https://172.22.132.10:2380"
serverCertSANs:
- k8s-m1
- 172.22.132.10
peerCertSANs:
- k8s-m1
- 172.22.132.10
networking:
podSubnet: "10.244.0.0/16"
EOF
保險起見,重啟一下kubelet
$ systemctl daemon-reload
$ systemctl restart kubelet
$ kubeadm init --config kubeadm-config.yaml >> ~/init.log # 輸出要保留,kubeadm join會用到
$ netstat -ntlp # 看(control plane components)各項服務有沒有開起來
kube-proxy
kube-scheduler
etcd
kube-controller
haproxy
kubelet
kube-apiserver
kube-proxy
# 查k8s cluster狀態
$ kubectl get nodes
$ kubectl -n kube-system get pods
$ export etcDIR=/etc/kubernetes/
$ export bakDIR=~/Documents/k8s-m1_CA_backup/
$ mkdir -p ~/Documents/k8s-m1_CA_backup/
$ cp ${etcDIR}/pki/ca.crt ${bakDIR}/pki/ca.crt
cp ${etcDIR}/pki/ca.key ${bakDIR}/pki/ca.key
cp ${etcDIR}/pki/sa.key ${bakDIR}/pki/sa.key
cp ${etcDIR}/pki/sa.pub ${bakDIR}/pki/sa.pub
cp ${etcDIR}/pki/front-proxy-ca.crt ${bakDIR}/pki/front-proxy-ca.crt
cp ${etcDIR}/pki/front-proxy-ca.key ${bakDIR}/pki/front-proxy-ca.key
cp ${etcDIR}/pki/etcd/ca.crt ${bakDIR}/pki/etcd/ca.crt
cp ${etcDIR}/pki/etcd/ca.key ${bakDIR}/pki/etcd/ca.key
cp ${etcDIR}/admin.conf ${bakDIR}/admin.conf
其他kubeadm init參數:
--pod-network-cidr=10.244.0.0/16 # pod的網段,我們跟官網用一樣的VIP網段
--apiserver-advertise-address= # 通常不用給,預設是用default getway來跟master's IP溝通
$ kubeadm init --pod-network-cidr=10.244.0.0/16 # 應該會先進行一些檢查,輸出一些資訊到螢幕上
備註:如果要重下kubeadm init,或者哪個步驟做錯,要砍掉k8s cluster的話...
有關drain,可參考:https://kubernetes.io/docs/reference/generated/kubectl/kubectl-commands#drain
$ kubectl drain <node name> --delete-local-data --force --ignore-daemonsets
$ kubectl delete node <node name>
餵給 kubeadm init 的檔案都會刪掉喔,請先備份
/etc/haproxy/haproxy.cfg # 不會刪
/etc/kubernetes/manifests/ # 目錄還在,檔案不見
$ kubeadm reset # 在要刪除的Node上,重置所有kubeadm安裝狀態
[reset] WARNING: changes made to this host by 'kubeadm init' or 'kubeadm join' will be reverted.
[reset] are you sure you want to proceed? [y/N]: y
[preflight] running pre-flight checks
[reset] stopping the kubelet service
[reset] unmounting mounted directories in "/var/lib/kubelet"
[reset] deleting contents of stateful directories: [/var/lib/kubelet /etc/cni/net.d /var/lib/dockershim /var/run/kubernetes /var/lib/etcd]
[reset] deleting contents of config directories: [/etc/kubernetes/manifests /etc/kubernetes/pki]
[reset] deleting files: [/etc/kubernetes/admin.conf /etc/kubernetes/kubelet.conf /etc/kubernetes/bootstrap-kubelet.conf /etc/kubernetes/controller-manager.conf /etc/kubernetes/scheduler.conf]
$ mkdir -p $HOME/.kube # 建目錄
$ sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config # copy設定檔
$ sudo chown $(id -u):$(id -g) $HOME/.kube/config # 改權限
如果kubectl是用root執行
$ export KUBECONFIG=/etc/kubernetes/admin.conf # 直接用/etc/...的設定檔
接下來,
kubeadm init 會輸出 kubeadm join 的指令,我們用這個指令來把node加到cluster
$ kubeadm token # master node跟worker node互相驗證用的token
c.建立Pod Network Add-on(附加組件)
當Master Node都完成部署後(我們只建1個)
接著要在此 Kubernetes 部署 Pod Network Plugin,
一樣用KaiRen大大的設定,
用 CoreOS Flannel 來提供簡單 Overlay Network 來讓 Pod 中的容器能夠互相溝通:
$ wget https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml
# 確認設定無誤後
$ kubectl apply -f kube-flannel.yml
clusterrole "flannel" created
clusterrolebinding "flannel" created
serviceaccount "flannel" configured
configmap "kube-flannel-cfg" configured
daemonset "kube-flannel-ds" configured
若參數 --pod-network-cidr=10.244.0.0/16 改變時,在kube-flannel.yml檔案也需修改net-conf.json欄位的 CIDR。
若使用 Virtualbox 的話,要修改kube-flannel.yml中的 command 綁定 iface,如command: [ "/opt/bin/flanneld", "--ip-masq", "--kube-subnet-mgr", "--iface=eth1" ]
確認Pod Network狀態
$ kubectl -n kube-system get po -l app=flannel -o wide
$ ip -4 a show flannel.1
$ route -n
CoreDNS將不會在安裝網絡之前啟動。
kubeadm只支援container network interface(CNI),不支持kubenet
kubeadm預設是用RBAC權限管理模型(Role-Based Access Control)
因為我們都在VM裡面跑,應該不用考慮實體的網路設備支援性問題,
如果你們要佈置在實體環境,設備採購上可能要考慮到。
我先選Flannel來試看看,如果你要用其他的請參考官網文件
$ kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/v0.10.0/Documentation/kube-flannel.yml # 加pod network
$ kubectl get pods --all-namespaces # 檢查CoreDNS pod是否正常運行
如果有錯誤,就要參考
https://kubernetes.io/docs/setup/independent/troubleshooting-kubeadm/
基於安全因素,通常不在 Master Node 跑 container
女王蜂(Master Node)是不工作的,工作(container)由工蜂(Worker Node)負責,
養蜂養得好才能獲得優質的「蜂蜜」
d.加入Worker Node()
Worker Node也要做「零.事前準備」,您應該已經裝好kubeadm、kubelet了
# 放 Pod YAML 檔
$ mkdir -p /etc/kubernetes/manifests/
SSH到準Worker Node(也要裝docker、kubeadm)
$ sudo su - # 轉換身份為root
# 跑步驟b中,Master Node執行kubeadm init所顯示的指令
$ kubeadm join --token <token> <master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>
大概長這樣
$ kubeadm join 172.22.132.9:8443 \
--token t4zvev.8pasuf89x2ze8htv \
--discovery-token-ca-cert-hash sha256:19c373b19e71b03d89cfc6bdbd59e8f11bd691399b38e7eea11b6043ba73f91d
加完後回 k8s-m1看有沒有加成功
root@k8s-m1$ kubectl get nodes # 檢查 Node 狀態
root@k8s-m1$ kubectl get cs # 檢查元件狀態
# 測試是否可以建立 Pod
# Pod 會被分到 Worker Node 進行,每個 Pod 中含有1~n個 container
root@k8s-m1$ kubectl run nginx --image nginx --restart=Never --port 80 # 開 Pod
# --type NodePort,如果沒有指定,預設是 ClusterIP 型態,只有 cluster內部能存取
root@k8s-m1$ kubectl expose pod nginx --port 80 --type NodePort # 指定 Service 型態 # 開 Service
root@k8s-m1$ kubectl get po,svc
# 外部需要透過 Service Object 連到 Pod
$ curl 712.22.132.10:xxxx # 試試 NGINX 服務
上面的 kubectl expose pod nginx ...... 也可以寫成yaml,再用 kubectl apply -f serviceNginx.yaml 建 Service
# serviceNginx.yaml
---
apiVersion: v1
kind: Service
metadata:
name: serviceNginx
spec:
type: NodePort
selector:
app: nginx
ports:
- protocol: TCP
port: 80
$ kubectl apply -f serviceNginx.yaml
$ kubectl get services
k8s 會分配一個 port 供 serviceNginx使用(不是80port喔),所有的Worker Node的這個port就會對應到serviceNginx
而 Servcie 跟 Pod 是靠 Label 跟 Selector 來識別
如果之前的 token 沒有記下來,可回Master Node下指令
$ kubeadm token list # token的時效為24小時
$ kubeadm token create # 取得新token
# 長得像這樣 5didvk.d09sbcov8ph2amjw
一樣在Master Node可取得自簽憑證 (的sha256的hash值的16進位格式)
# 同一行指令喔
$ openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | \ openssl dgst -sha256 -hex | sed 's/^.* //'
# 長得像這樣 8cb2de97839780a412b93877f8507ad6c94f73add17d5d7058e91741c9d5ec78
$ kubectl get nodes # 如果加成功,在Master Node下這個指令,就能看到剛剛的Worker Node
d.從Master Node以外的電腦,操控cluster(非必需) 沒實驗喔,有興趣的自己試
如果是用root帳號
$ scp root@<master ip>:/etc/kubernetes/admin.conf . # 從Master Node複製admin.conf
$ kubectl --kubeconfig ./admin.conf get nodes # 多餵個admin.conf
# 由此可知有admin.conf者,得cluster的super user權限
# 由於admin.conf權限太大,建議改給KubeConfig文件,這個指令還在alpha階段喔
# https://www.mankier.com/1/kubeadm-alpha-phase-kubeconfig-user
$ kubeadm alpha phase kubeconfig user --client-name <CN>
$ kubectl create (cluster)rolebinding # 為特定的ClusterRole建ClusterRoleBinding
e.從Master Node以外的電腦,使用API Server(非必需)
使用指令 kubectl proxy
$ scp root@<master ip>:/etc/kubernetes/admin.conf .
$ kubectl --kubeconfig ./admin.conf proxy
然後試看看 http://localhost:8001/api/v1
f.如果上述都成功,可以考慮用「dashboard」
https://github.com/kubernetes/dashboard#kubernetes-dashboard
我猜應該是在 Master Node下的吧…
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
然後在其他電腦用kubectl proxy,應該就能享用dashboard囉
$ kubectl proxy
==實作已結束==我是分隔線===
===以下是官網文件補充======
二、Kubelet configuration patterns
參考:https://kubernetes.io/docs/setup/independent/kubelet-integration/
kubeadm init跟kubeadm join的一些參數、設定檔,以後有需要再補上
$ kubeadm init --service-cidr 10.96.0.0/12 # --pod-network-cidr=10.244.0.0/16
--cluster-dns # 設定kubelet使用的DNS地址
將新設定套到kubelet,
kubeadm會寫入 /etc/kubernetes/bootstrap-kubelet.conf,
包含:CA憑證、Bootstrap Token
$ systemctl daemon-reload && systemctl restart kubelet
備註:
用於TLS Bootstrap的是/etc/kubernetes/bootstrap-kubelet.conf,只有在/etc/kubernetes/kubelet.conf不存在時使用
unique kubelet identity 寫在 /etc/kubernetes/kubelet.conf
kubelet相關的元件設定 寫在 /var/lib/kubelet/config.yaml
動態環境參數 KUBELET_KUBEADM_ARGS 的來源是 /var/lib/kubelet/kubeadm-flags.env
三、使用kubeadm建立高度可用(hight available)的cluster
參考:https://kubernetes.io/docs/setup/independent/high-availability/
官網文件提供2種方法,我們選比較簡單的方法來實作
這2種方式都無法提供 LoadBalancer類型的Service Object、動態PersistentVolumes(ex:GCE PV,Azure PV)
control panel或etcd node上的所有 指令 都要用 root 執行
假設 pod CIDR 是 --pod-network-cidr=10.244.0.0/16
設定SSH,請參考「02 補充說明:SSH設定」
$ eval $(ssh-agent)
$ ssh-add ~/.ssh/path_to_private_key
$ eval $(ssh-agent)
$ ssh -A 10.0.0.7
$ sudo -E -s
其他指令
kubectl
$ kubectl config current-context # 正在管理的cluster
$ kubectl get pods [pod name] -o jsonpath --template={.status.podIP} # 查 Pod 的 IP